#include "unix.h"

uint32_t crearClienteUnix(char* path) {
	uint32_t sd;
	uint32_t rc;
	struct sockaddr_un serveraddr;
	uint32_t longitud;
	printf(" estas en crearClienteUnix\n");
	sd = socket(AF_UNIX, SOCK_STREAM, 0);
	if (sd < 0) {
		perror("socket() failed");
	}

	serveraddr.sun_family = AF_UNIX;
	strcpy(serveraddr.sun_path, path);
	longitud = sizeof(struct sockaddr_un);
	printf("a punto de entrar al while\n");
	while(rc = connect(sd,&serveraddr,longitud));

	return sd;

}

uint32_t enviarTexto(uint32_t sd, char* texto) {
	return send(sd,texto, strlen(texto)+1, 0);
}

uint32_t crearServerUnix(char* path) {
	uint32_t sd;
	uint32_t rc;
	uint32_t cliente;
	struct sockaddr_un serveraddr;
	uint32_t longitud;

	sd = socket(AF_UNIX, SOCK_STREAM, 0);
	if (sd < 0) {
		perror("socket() failed");
	}

	serveraddr.sun_family = AF_UNIX;
	strcpy(serveraddr.sun_path, path);
	longitud = sizeof(struct sockaddr_un);

	//crea el fichero
	unlink(serveraddr.sun_path);

	rc = bind(sd,&serveraddr, longitud);

	if (rc < 0) {
		perror("bind() failed");
		exit(1);
	}

	return sd;
}

uint32_t meQuedoEscuchando(uint32_t ListeningSocket, uint32_t cantidadDeConexionesMaximas){
	//Pone el socket a escuchar conexiones entrantes en IP en el Puerto antes especificado
	if (listen (ListeningSocket, cantidadDeConexionesMaximas) == -1) {
		perror("listen consola");
		return 0;
	} else {
		printf ("ListeningSocket: Esperando una conexion entrante\n");
		return ListeningSocket;
	}
}

uint32_t aceptarConexionEnUnix(uint32_t sd, char* path) {
	//se conecto un cliente
	uint32_t cliente;
	uint32_t longitud;
	struct sockaddr_un serveraddr;

	serveraddr.sun_family = AF_UNIX;
	strcpy(serveraddr.sun_path, path);
	longitud = sizeof(struct sockaddr_un);


	cliente = accept(sd, &serveraddr, &longitud);
	if (cliente <0) {
		perror("accept");
		exit(1);
		} else printf("Acepte la conexion\n");

	return cliente;
}

uint32_t serverEnUnix(char* path){
	uint32_t socket;
	uint32_t server;

	socket = crearServerUnix(path);
	server = meQuedoEscuchando(socket, 1);
	return aceptarConexionEnUnix(server,path);
}

void cerrarConexion(uint32_t socket) {
	close(socket);
}
